import { SuccessModel } from './resModel'

const fs = require('fs')
const path = require('path')
const unzipper = require('unzipper')

// 定义一个函数来计算 ZIP 文件中的文件数量
function countFilesInZip(zipFilePath, callback) {
  let fileCount = 0
  fs.createReadStream(zipFilePath)
    .pipe(unzipper.Parse())
    .on('entry', function (entry) {
      // 增加文件计数（注意：这里也会计数目录，如果你只想计数文件，需要额外判断）
      fileCount++
      const data = { msg: '正在处理', status: 0, count: fileCount }
      callback(data)
      // 如果我们只关心文件而不关心目录，可以检查 entry.type
      // if (entry.type !== 'Directory') {
      // 这里可以处理文件内容，但如果不需要，就使用 autodrain() 来自动排放流
      entry.autodrain()
      // }
    })
    .on('finish', function () {
      // 当所有条目都被处理后，调用回调函数并传递文件数量
      callback({ msg: '统计完成', status: 1, count: fileCount })
    })
    .on('error', function (err) {
      // 如果发生错误，调用回调函数并传递错误对象
      callback({ msg: '出错了', status: -1, count: err })
    })
}

export async function openZip(zipFilePath, targetDir, callback) {
  mkdirSync(targetDir)
  let currentCount = 0
  const filePaths: string[] = [] // 用于存储文件路径的数组
  await countFilesInZip(zipFilePath, (fileCount) => {
    if (fileCount.status === 1) {
      const zipStream = fs.createReadStream(zipFilePath)
      zipStream
        .pipe(unzipper.Parse())
        .on('entry', async (entry) => {
          const entryPath = entry.path
          const entryDir = path.join(targetDir, entryPath)
          const fileName = entryPath.split('/').pop()
          if (fileName) {
            filePaths.push(entryDir)
            await entry.buffer().then((buffer) => {
              fs.writeFileSync(entryDir, buffer)
            })
            callback(new SuccessModel({ count: currentCount++ }, '正在解压', 1))
          } else {
            mkdirSync(entryDir)
          }
        })
        .on('finish', () => {
          callback(new SuccessModel({ filePaths: filePaths }, '解压完成', 2))
        })
    } else {
      callback(new SuccessModel({ fileCountAll: fileCount.count }, '正在统计', 0))
    }
  })
}

const mkdirSync = (targetDir) => {
  if (!fs.existsSync(targetDir)) {
    fs.mkdirSync(targetDir, { recursive: true })
  } else {
  }
}
